home *** CD-ROM | disk | FTP | other *** search
- ;******************************************
- ;* L I S T M A N A G E R *
- ;******************************************
-
- INCLUDE Library.Txt
-
- ;--------------------------------
- ; *** Externals Definition ***
- ;--------------------------------
-
- XDEF InstalList
- XDEF FindList
- XDEF DrawLists
- XDEF DeactivateList
- XDEF ActivateList
- XDEF ListKey
-
- ;-------------------------------
- ; ** List Resource Template **
- ;-------------------------------
-
- vRect EQU 0
- LdataBounds EQU 8
- cSize EQU 16
- listDef EQU 20
- LvScroll EQU 22
- LhScroll EQU 24
- drawIt EQU 26
- hasGrow EQU 28
- lRefCon EQU 30
- LTextFont EQU 34
- LTextSize EQU 36
-
- ;-------------------------------
- ; ******* List Record *********
- ;-------------------------------
-
- ; ListRec = Record { 88 bytes}
- ;{ 0} rView : Rect
- ;{ 8} port : GrafPtr
- ;{ 12} indent : Point
- ;{ 16} cellSize : Point
- ;{ 20} visible : Rect
- ;{ 28} vScroll : ControlHandle
- ;{ 32} hScroll : ControlHandle
- ;{ 36} selFlags : SignedByte
- ;{ 37} LActive : BOOLEAN
- ;{ 38} LReserved : SignedByte
- ;{ 39} listFlags : SignedByte
- ;{ 40} clikTime : LongInt
- ;{ 44} clikLoc : Point
- ;{ 48} mouseLoc : Point
- ;{ 52} LClikLoop : ProcPtr
- ;{ 56} lastClick : Point
- ;{ 60} refCon : LongInt
- ;{ 64} listDefProc : Handle
- ;{ 68} userHandle : Handle
- ;{ 72} dataBounds : Rect
- ;{ 80} cells : Handle
- ;{ 84} maxIndex : INTEGER
- ;{ 86} cellArray : Array[1:1] of INTEGER
-
- ;-------------------------------
- ;***** The List AuxRecord ******
- ;-------------------------------
-
- ;AuxListRec = Records {14}
- ;{0} ID :INTEGER
- ;{2} theList :ListHandle
- ;{6} nextList :AuxListHandle
- ;{10} fontList :INTEGER
- ;{12} sizList :INTEGER
-
- ;---------------------------------------------------------------------------
- ;FUNCTION InstalList(listID:INTEGER;whichWindow:WindowPtr):OSErr;
- ;---------------------------------------------------------------------------
-
- ;-------------------------------
- ; Parameters
- ;-------------------------------
-
- whichWindow EQU 8
- listID EQU 12
-
- ;-------------------------------
- ; Local Variables
- ;-------------------------------
-
- theHandle EQU -10
- theNList EQU -6
- error EQU -2
-
- ;-------------------------------
-
-
- InstalList
- LINK A6,#-10 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVE.W #noErr,error(A6) ;
- SUBQ.L #4,SP ;
- MOVE.L #'LIST',-(SP) ;
- MOVE.W listID(A6),-(SP) ;get a list
- _GetResource ;template from
- MOVEA.L (SP)+,A3 ;disk
- SUBQ.L #2,SP ;
- _ResError ;
- MOVE.W (SP)+,error(A6) ;if resource
- BNE @0 ;can't be read go @0
- MOVE.L A3,theHandle(A6) ;
- MOVE.L (A3),A1 ;
- SUBQ.L #4,SP ;
- PEA vRect(A1) ;
- PEA LdataBounds(A1) ;
- MOVE.L cSize(A1),-(SP) ;
- MOVE.W listDef(A1),-(SP) ;
- MOVE.L whichWindow(A6),-(SP);
- MOVE.W drawIt(A1),-(SP) ;
- MOVE.W hasGrow(A1),-(SP) ;
- MOVE.W LhScroll(A1),-(SP) ;
- MOVE.W LvScroll(A1),-(SP) ;
- _LNew ;create a new
- MOVEA.L (SP)+,A1 ;list
- MOVE.L A1,theNList(A6) ;
- MOVE.L (A1),A1 ;
- MOVE.L theHandle(A6),A0 ;
- MOVE.L (A0),A0 ;set the list refcon
- MOVE.L lRefCon(A0),refCon(A1);
- MOVE.L whichWindow(A6),A0 ;
- MOVE.L WrefCon(A0),A0 ;
- MOVE.L (A0),A0 ;place the new
- MOVE.L WList(A0),A2 ;listhandle
- MOVEA.L (A2),A3 ;in the linked list
- CMPI.L #NIL,theList(A3) ;of list but before...
- BEQ @1 ;
- @3
- CMPI.L #NIL,nextList(A3) ;we must find
- BEQ @2 ;the last list
- MOVEA.L nextList(A3),A3 ;AuxRec of our
- MOVEA.L (A3),A3 ;linked list
- BRA @3 ;
- @2
- MOVEQ #SizeListAuxRec,D0 ;... we create a new
- _NewHandle ;list AuxRec
- MOVE.W D0,error(A6) ;
- BNE @0 ;if error, go @0
- MOVE.L A0,nextList(A3) ;
- MOVEA.L A0,A3 ;
- MOVEA.L (A3),A3 ;initialize all
- MOVE.L theNList(A6),theList(A3);
- MOVE.W listID(A6),LID(A3) ;list AuxRec
- MOVE.L #NIL,nextList(A3) ;fields
- MOVE.L theHandle(A6),A0 ;
- MOVE.L (A0),A0 ;
- MOVE.W LTextFont(A0),fontList(A3);
- MOVE.W LTextSize(A0),sizList(A3) ;
- BRA @5 ;
- @1
- MOVE.L theNList(A6),theList(A3) ;it's the first
- MOVE.W listID(A6),LID(A3) ;space for the list
- MOVE.L #NIL,nextList(A3) ;has been already
- MOVE.L theHandle(A6),A0 ;allocated.
- MOVE.L (A0),A0 ;
- MOVE.W LTextFont(A0),fontList(A3);
- MOVE.W LTextSize(A0),sizList(A3) ;
- @5
- MOVE.L theNList(A6),A1 ;
- MOVE.L (A1),A1 ;if our new
- CMPI.L #NIL,vScroll(A1) ;list has scroll bars
- BEQ @4 ;will put -1 in the
- MOVE.L vScroll(A1),A0 ;cntrlRefCon of each
- MOVE.L (A0),A0 ;scroll bars.
- MOVE.L #-1,contrlrfCon(A0) ;(see article)
- CLR.B contrlVis(A0) ;
- @4 ;
- CMPI.L #NIL,hScroll(A1) ;
- BEQ @0 ;
- MOVE.L hScroll(A1),A0 ;
- MOVE.L (A0),A0 ;
- MOVE.L #-1,contrlrfCon(A0) ;
- CLR.B contrlVis(A0) ;
- @0
- MOVE.W error(A6),D0 ;
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #6,SP ;
- MOVE.W D0,(SP) ;
- JMP (A0) ;
-
- ;---------------------------------------------------------------------------
- ;FUNCTION FindList(testControl:BOOLEAN;thePoint:Point;
- ; whichWindow:WindowPtr):ListHandle;
- ;---------------------------------------------------------------------------
-
- ;-------------------------------
- ; Parameters
- ;-------------------------------
-
- thePoint EQU 12
- testControl EQU 16
-
- ;-------------------------------
- ; Local Variables
- ;-------------------------------
-
- AuxListHdl EQU -4
-
- FindList
- LINK A6,#-4 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVE.L #NIL,A1 ;
- MOVE.L whichWindow(A6),A0 ;
- MOVE.L WrefCon(A0),A0 ;
- MOVE.L (A0),A0 ;
- MOVE.L WList(A0),A3 ;
- MOVE.L A3,AuxListHdl(A6) ;find the
- MOVEA.L (A3),A3 ;first list
- CMPI.L #NIL,theList(A3) ;if no list...
- BEQ @6 ;go @6
- @3
- MOVEA.L theList(A3),A2 ;
- MOVE.L (A2),A2 ;
- SUBQ #8,SP ;we push the
- MOVE.L rview(A2),(SP) ;list's view rect
- MOVE.L rview+4(A2),4(SP) ;
- MOVE.L SP,A0 ;
- SUBQ.L #2,SP ;
- MOVE.L thePoint(A6),-(SP) ;
- MOVE.L A0,-(SP) ;
- MOVE.L (SP),A0 ;
- TST.B testControl(A6) ;does user wants to
- BEQ @5 ;know if he clicks
- CMPI.L #NIL,vScroll(A2) ;in the list scroll
- BEQ @4 ;bar ?
- ADDI.W #15,6(A0) ;if yes, we add
- @4
- CMPI.L #NIL,hScroll(A2) ;the scroll bar
- BEQ @5 ;width to the view rect
- ADDI.W #15,4(A0) ;coordinates
- @5
- _PtInRect ;
- MOVE.L AuxListHdl(A6),A3 ;
- MOVE.L (A3),A3 ;
- TST.B (SP)+ ;if we've clicked
- ADDQ.L #8,SP ;in this list go @1
- BNE @1 ;
- CMPI.L #NIL,nextList(A3) ;we've not clicked
- BEQ @6 ;in this one, check
- MOVEA.L nextList(A3),A3 ;another list
- MOVE.L A3,AuxListHdl(A6) ;if any.if not
- MOVEA.L (A3),A3 ;go @6
- BRA @3 ;
- @1
- MOVE.L theList(A3),A1 ;
- @6
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #10,SP ;clean up the
- MOVE.L A1,(SP) ;stack.
- JMP (A0) ;
-
-
- ;---------------------------------------------------------------------------
- ;PROCEDURE DrawLists(whichWindow:WindowPtr);
- ;---------------------------------------------------------------------------
-
- ;-------------------------------
- ; Local Variables
- ;-------------------------------
-
- vCntl EQU -8
- hCntl EQU -12
-
- Drawlists
- LINK A6,#-12 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVE.L whichWindow(A6),A0 ;
- MOVE.L WrefCon(A0),A0 ;
- MOVE.L (A0),A0 ;
- MOVE.L WList(A0),A3 ;
- MOVE.L A3,AuxListHdl(A6) ;first list
- MOVE.L (A3),A3 ;saved
- CMPI.L #NIL,theList(A3) ;if no list in
- BEQ @6 ;this window :@6
- @3
- MOVE.L theList(A3),A3 ;
- MOVE.L (A3),A3 ;
- CMPI.L #NIL,vScroll(A3) ;
- BEQ @4 ;
- MOVE.L vScroll(A3),-(SP) ;
- _Draw1Control ;
- @4
- MOVE.L AuxListHdl(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L theList(A3),A3 ;
- MOVE.L (A3),A3 ;
- CMPI.L #NIL,hScroll(A3) ;
- BEQ @5 ;
- MOVE.L hScroll(A3),-(SP) ;
- _Draw1Control ;
- @5
- MOVEA.L whichWindow(A6),A0 ;
- MOVE.L AuxListHdl(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.W fontList(A3),txFont(A0) ;
- MOVE.W sizList(A3),txSize(A0) ;
- MOVE.L theList(A3),A1 ;
- MOVE.L (A1),A1 ;
- MOVE.L vScroll(A1),vCntl(A6) ;
- MOVE.L hScroll(A1),hCntl(A6) ;
- CLR.L hScroll(A1) ;
- CLR.L vScroll(A1) ;
- MOVE.L visRgn(A0),-(SP) ;
- MOVE.L theList(A3),-(SP) ;
- _LUpdate ;
- MOVE.L AuxListHdl(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L theList(A3),A1 ;
- MOVE.L (A1),A1 ;
- MOVE.L vCntl(A6),vScroll(A1) ;
- MOVE.L hCntl(A6),hScroll(A1) ;
- CMPI.L #NIL,nextList(A3) ;
- BEQ @6 ;
- MOVEA.L nextList(A3),A3 ;
- MOVE.L A3,AuxListHdl(A6) ;
- MOVEA.L (A3),A3 ;
- BRA @3 ;
- @6
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #4,SP ;
- JMP (A0) ;
-
-
- ;---------------------------------------------------------------------------
- ;PROCEDURE DeactivateList(whichWindow:WindowPtr);
- ;---------------------------------------------------------------------------
-
- DeactivateList
- LINK A6,#0 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVEA.L whichWindow(A6),A1 ;
- MOVE.L WrefCon(A1),A1 ;
- MOVE.L (A1),A1 ;
- MOVE.L WactivLst(A1),A1 ;
- MOVE.L A1,CurrentList(A5) ;
- CMPA.L #NIL,A1 ;
- BEQ @6 ;
- MOVE.W #FALSE,-(SP) ;
- MOVE.L A1,-(SP) ;
- _LActivate ;
- @6
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #4,SP ;
- JMP (A0) ;
-
-
- ;---------------------------------------------------------------------------
- ;PROCEDURE ActivateList(whichWindow:WindowPtr);
- ;---------------------------------------------------------------------------
-
-
- ActivateList
- LINK A6,#0 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVEA.L whichWindow(A6),A1 ;
- MOVE.L WrefCon(A1),A1 ;
- MOVE.L (A1),A1 ;
- MOVE.L WactivLst(A1),A1 ;
- MOVE.L A1,CurrentList(A5) ;
- CMPA.L #NIL,A1 ;
- BEQ @6 ;
- MOVE.W #TRUE,-(SP) ;
- MOVE.L A1,-(SP) ;
- _LActivate ;
- @6
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #4,SP ;
- JMP (A0) ;
-
-
-
-
- ;---------------------------------------------------------------------------
- ;PROCEDURE ListKey(key:Char;inList:ListHandle);
- ;---------------------------------------------------------------------------
-
- ;-------------------------------
- ; Parameters
- ;-------------------------------
-
- key EQU 12
- inList EQU 8
-
- ;-------------------------------
- ; Local Variables
- ;-------------------------------
-
- cellule EQU -4
- cellule2 EQU -8
-
- ;-------------------------------
-
- ListKey
- LINK A6,#-8 ;
- MOVEM.L A2-A4/D3-D7,-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LLastClick ;coordinates
- MOVE.L (SP)+,cellule(A6) ;of last clicked
- MOVE.L cellule(A6),cellule2(A6) ;cell in "cellule"
- CMPI.B #$0D,key(A6) ;
- BEQ GoDown ;
- CMPI.B #$03,key(A6) ;
- BEQ GoDown ;
- CMPI.B #$1B,key(A6) ;
- BEQ GoAway ;
- CMPI.B #$09,key(A6) ;
- BEQ GoAway ;
- CMPI.B #$1E,key(A6) ;
- BEQ GoUp ;
- CMPI.B #$1F,key(A6) ;
- BEQ GoDown ;
- CMPI.B #$1D,key(A6) ;
- BEQ GoRight ;
- CMPI.B #$1C,key(A6) ;
- BEQ GoLeft ;
- CMPI.B #$08,key(A6) ;
- BEQ ClearCell ;
- PEA key(A6) ;
- MOVE.W #1,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LAddToCell ;
- MOVE.L inList(A6),A1 ;
- MOVE.L (A1),A0 ;
- MOVE.L port(A0),A0 ;
- MOVE.L WrefCon(A0),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L WList(A3),A3 ;
- MOVE.L (A3),A3 ;
- @2
- CMPA.L theList(A3),A1 ;
- BEQ @1 ;
- MOVE.L nextList(A3),A3 ;
- MOVE.L (A3),A3 ;
- BRA @2 ;
- @1
- MOVE.W fontList(A3),txFont(A0) ;
- MOVE.W sizList(A3),txSize(A0) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LDraw ;
- BRA GoAway ;
- ClearCell
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LClrCell ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LDraw ;
- BRA GoAway ;
-
- GoUp
- TST.W cellule(A6) ;
- BEQ GoAway ;
- MOVE.W #FALSE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- SUBI.W #1,cellule(A6) ;
- MOVE.W #TRUE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L cellule(A6),lastClick(A3);
- BRA GoAway ;
-
- GoDown
- MOVE.W cellule(A6),D0 ;
- ADDQ #1,D0 ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- LEA dataBounds(A3),A0 ;
- CMP.W bottom(A0),D0 ;
- BEQ GoAway ;
- MOVE.W #FALSE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- ADDI.W #1,cellule(A6) ;
- MOVE.W #TRUE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L cellule(A6),lastClick(A3) ;
- BRA GoAway ;
-
- GoRight
- MOVE.W cellule+2(A6),D0 ;
- ADDQ #1,D0 ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- LEA dataBounds(A3),A0 ;
- CMP.W right(A0),D0 ;
- BEQ GoAway ;
- MOVE.W #FALSE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- ADDI.W #1,cellule+2(A6) ;
- MOVE.W #TRUE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L cellule(A6),lastClick(A3) ;
- BRA GoAway ;
-
- GoLeft
- TST.W cellule+2(A6) ;
- BEQ GoAway ;
- MOVE.W #FALSE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- SUBI.W #1,cellule+2(A6) ;
- MOVE.W #TRUE,-(SP) ;
- MOVE.L cellule(A6),-(SP) ;
- MOVE.L inList(A6),-(SP) ;
- _LSetSelect ;
- MOVE.L inList(A6),A3 ;
- MOVE.L (A3),A3 ;
- MOVE.L cellule(A6),lastClick(A3) ;
-
- GoAway
- MOVE.L inList(A6),-(SP) ;
- _LAutoScroll ;
- MOVEM.L (SP)+,A2-A4/D3-D7 ;
- UNLK A6 ;
- MOVE.L (SP)+,A0 ;
- ADD.L #8,SP ;
- JMP (A0) ;
-
- END